#include <iostream>
#include <stdlib.h>
#include <sys/wait.h>
#include <string.h>
#include <fstream>
#include "../lib/Fifo.h"
#define BUFFSIZE 300
#define ARCHIVO_FIFO "/tmp/archivo_fifo"
#define ARCHIVO_A_ENVIAR "./tmp/probandoFifo.txt"
#define ARCHIVO_RECIBIDO "./tmp/Recibido.txt"


using namespace std ;

int main () {


	int pid = fork () ;

	if ( pid == 0 ) {

		int num;
		std::ofstream archivoRecibido(ARCHIVO_RECIBIDO,ios::out | ios::binary);
		char buffer [ BUFFSIZE ];
		Fifo canal ( ARCHIVO_FIFO ) ;

		if(!archivoRecibido ){
			cerr<<"No se pudo abrir el archivo" << ARCHIVO_RECIBIDO<< endl;
			exit(1);
		}

		// lector
		canal.abrir(true);

		do{
			if ((num = canal.leer ( buffer , BUFFSIZE )) == -1){
				perror("read");
			}else {
				archivoRecibido.write(buffer,num);
				cout << " Lector : lei el dato [ " << buffer << " ] del pipe " << endl ;
			}
		}while(num>0);

		archivoRecibido.close();
		cout << " Lector : fin del proceso " << endl ;
		canal . cerrar () ;
		exit ( 0 ) ;

	} else {

		Fifo canal(ARCHIVO_FIFO) ;
		int num, size;
		char s[300];
		char * memblock;
		std::ifstream archivoEntrada(ARCHIVO_A_ENVIAR,ios::binary|ios::ate);

		if(!archivoEntrada ){
			cerr<<"No se pudo abrir el archivo" << ARCHIVO_A_ENVIAR<< endl;
			exit(1);
		}

		size = archivoEntrada.tellg();
		memblock = new char [size];
		archivoEntrada.seekg (0, ios::beg);
		archivoEntrada.read (memblock, size);

		canal.abrir(false);
		cout << " Escritor : duermo 5" << endl;
		sleep(5);
		canal.escribir(memblock, size);

		//		do{
		//			archivoEntrada.read(s,300);
		//			if ((num = canal.escribir(s ,300)) == -1){
//				cout << "ERROR en lectura del archivo." <<endl;
//				perror("write");
//			}
//			else{
//				cout << " Escritor : escribo el dato [ " << s << " ] en el fifo " << endl ;
//			}
//		}while(!archivoEntrada.eof());


		archivoEntrada.close();

		// esperar a que el hijo termine
		canal.cerrar() ;
		wait ( NULL ) ;
		cout << " Escritor : fin del proceso " << endl ;

	    delete[] memblock;
		exit ( 0 ) ;
	}
}
